Последние изменения - Поиск:

edit SideBar

ОперацияВзятияАдреса

Операции взятия адреса в Обероне вообще нет. Но на самом деле она часто используется.

См. https://forum.oberoncore.ru/viewtopic.php?p=20937

==========================================================
Madzi  
 Заголовок сообщения: Re: Общие вопросы по программированию для BluebottleСообщениеДобавлено: Вторник, 04 Ноябрь, 2008 16:30

Откуда: Россия, Санкт-Петербург      
Ещё один глупый вопрос.
Никак не могу понять, как мне получить указатель на переменную.

Допустим у меня есть тип
Код:
TYPE
  Type = POINTER TO TypeDesc;
  TypeDesc = RECORD
    ...
  END;

и далее в тексте
Код:
VAR
  vt: ARRAY 50 OF TypeDesc;
  curt: Type;

хочется иметь возможность присваивать переменной curt адреса элементов массива vt, например:
Код:
  curt := ADDRESS(vt[10]);

Как это сделать?

==========================================================
Евгений Темиргалеев  
 Заголовок сообщения: Re: Общие вопросы по программированию для BluebottleСообщениеДобавлено: Вторник, 04 Ноябрь, 2008 16:57

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4539
Откуда: Россия, Орёл   
В Оберонах нету операции взятия адреса, адрес статического объекта получить нельзя. Указатели используются только для создания объектов динамически при помощи NEW.

==========================================================
AVC    
 Заголовок сообщения: Re: Общие вопросы по программированию для BluebottleСообщениеДобавлено: Вторник, 04 Ноябрь, 2008 17:05

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград     
Madzi писал(а):
Как это сделать?
Так сделать нельзя.
Указатель (если он не нулевой) может указывать только на отдельную переменную в динамической памяти (куче).
Но уверен, что можно найти подходящее для Вашей задачи другое решение.
На вскидку.
1. Кроме указателей можно использовать "курсоры" - целочисленные переменные, хранящие индексы в массиве.
2. Можно завести не массив TypeDesc, а массив Type.
3. Можно вызывать процедуры с типом аргумента VAR v: TypeDesc.
И т.д.


==========================================================
bohdant
 Заголовок сообщения: Re: Общие вопросы по программированию для BluebottleСообщениеДобавлено: Вторник, 04 Ноябрь, 2008 17:56

Зарегистрирован: Суббота, 15 Март, 2008 20:00
Сообщения: 297
Откуда: Київ, Україна 
Никогда не говори никогда  :wink:
Код:
MODULE testadr;
IMPORT SYSTEM,KernelLog;
TYPE
   TypeDesc = RECORD
      a:BOOLEAN;
      b:LONGINT;
   END;
VAR
    vt: ARRAY 50 OF TypeDesc;
    testvar:LONGINT;
    adr : SYSTEM.ADDRESS;
PROCEDURE AAA*;
BEGIN
   adr:=SYSTEM.ADR(vt[3]);
   KernelLog.Address(adr);   KernelLog.Ln;
   adr:=SYSTEM.ADR(vt[14]);
   KernelLog.Address(adr);KernelLog.Ln;
   adr:=SYSTEM.ADR(vt[15]);
   KernelLog.Address(adr);KernelLog.Ln;
END AAA;
END testadr.AAA~


==========================================================
bohdant
 Заголовок сообщения: Re: Общие вопросы по программированию для BluebottleСообщениеДобавлено: Вторник, 04 Ноябрь, 2008 18:00

Проверил, можно даже так:
adr:=SYSTEM.ADR(vt[15].b);


Пожаловаться на это сообщение
Вернуться к началу       Профиль Отправить личное сообщение Отправить email  Ответить с цитатой  

==========================================================
AVC    
 Заголовок сообщения: Re: Общие вопросы по программированию для BluebottleСообщениеДобавлено: Вторник, 04 Ноябрь, 2008 18:13

bohdant писал(а):
Никогда не говори никогда  :wink:
Конечно, в обход системы типов (IMPORT SYSTEM) можно многое сделать. :roll:
Но не лучше ли тогда просто использовать Си?
Теперь по сути вопроса.
Не знаю, как конкретно обстоит дело в АО, но в Обероне адрес записи еще не есть её полноценный указатель.
Дело в том, что в записях в динамической памяти содержится (скрытый) указатель на дескриптор типа (т.н. type tag), а записям в стеке и статической памяти с этим не повезло.
IMHO, если мы возьмём и передадим адрес такой записи в качестве указателя, могут случиться разные неприятности. Например, при динамической проверке типа IF p IS Type THEN ... END.

==========================================================
bohdant
 Заголовок сообщения: Re: Общие вопросы по программированию для BluebottleСообщениеДобавлено: Вторник, 04 Ноябрь, 2008 19:08

Зарегистрирован: Суббота, 15 Март, 2008 20:00
Сообщения: 297
Откуда: Київ, Україна 
AVC писал(а):
Конечно, в обход системы типов (IMPORT SYSTEM) можно многое сделать. :roll:
Но не лучше ли тогда просто использовать Си?

А зачем использовать Си если можно и АО?
В том то и дело, что бывают "узкие" места, где важна скорость.
Конечно, нужно еще незабывать, что можно использовать секцию CODE  :)

А по большому, мне АО этим и нравится: Нельзя! ....но если сильно хочется, то можно  :lol:

==========================================================
Wlad   
 Заголовок сообщения: Re: Общие вопросы по программированию для BluebottleСообщениеДобавлено: Вторник, 04 Ноябрь, 2008 22:41

Madzi писал(а):
Код:
  curt := ADDRESS(vt[10]);

Как это сделать?

А - ЗАЧЕМ???
Обероны всячески отваживают от подобной практики и подходов.
ЧТО ТАКОЕ "указатель на элемент массива"?
Вы уже и так на него ссылаетесь через индекс.
Про аргумент "эффективность" можно забыть.
Всё может смениться при переходе на другую платформу. Даже на Си я, работая на Мегах, пришёл к заключению, что адресация через индекс ЭФФЕКТИВНЕЕ, при работе с элементами массивов, чем ПРЯМАЯ АДРЕСАЦИЯ! Просто в силу кодов проца, реализующих индексное смещение (относительную адресацию)...

Си поощряет "раннюю оптимизацию" (к чему это ведёт в учебниках и советах аксакалов хорошо описано). Обероны заставляют сначала общо решить задачу.

Решайте задачи!

==========================================================
bohdant
 Заголовок сообщения: Re: Общие вопросы по программированию для BluebottleСообщениеДобавлено: Вторник, 04 Ноябрь, 2008 23:44

Я думаю, что все можно свести к такому варианту ;) и все проблемы уйдут...
Код:
VAR
  vt: ARRAY 50 OF Type;
  curt: Type;


Владимир Лось писал(а):
А - ЗАЧЕМ???
Обероны всячески отваживают от подобной практики и подходов.

Кстати поглядел я исхдохники Аоса: там сплош и рядом адрессная арихметика :))
Почему? У кого какие идеи?

==========================================================
Madzi  
 Заголовок сообщения: Re: Общие вопросы по программированию для BluebottleСообщениеДобавлено: Вторник, 04 Ноябрь, 2008 23:59
Аватара пользователя

Зарегистрирован: Суббота, 12 Июль, 2008 22:49
Сообщения: 573
Откуда: Россия, Санкт-Петербург      
bohdant писал(а):
Я думаю, что все можно свести к такому варианту ;) и все проблемы уйдут...
Код:
VAR
  vt: ARRAY 50 OF Type;
  curt: Type;


Попробую свести, но с налёту не получится, буду думать...
bohdant писал(а):
Я думаю, что все можно свести к такому варианту ;) и все проблемы уйдут...
Владимир Лось писал(а):
А - ЗАЧЕМ???
Обероны всячески отваживают от подобной практики и подходов.

Кстати поглядел я исхдохники Аоса: там сплош и рядом адрессная арихметика :))
Почему? У кого какие идеи?

Я так полагаю, что ради скорости портирования. Т.е. часть кода Аос не оригинальная, а портирована с того же Си (драйвера, например)

==========================================================
Ярослав Романченко    
 Заголовок сообщения: Re: Общие вопросы по программированию для BluebottleСообщениеДобавлено: Среда, 05 Ноябрь, 2008 09:17

bohdant писал(а):
Почему? У кого какие идеи?
Нужно чётко понимать, что в системе есть жёстко-аппаратнозависимые модули, их даже снабжают префиксами вроде i386., есть возможно менее зависимые, импортирующие SYSTEM.
Импортирования SYSTEM нужно в своих модулях всячески избегать только и всего-то, если конечно это не какой-то драйвер  :)


Пожаловаться на это сообщение
Вернуться к началу       Профиль Отправить личное сообщение  Ответить с цитатой  

==========================================================
Ярослав Романченко    
 Заголовок сообщения: Re: Общие вопросы по программированию для BluebottleСообщениеДобавлено: Среда, 05 Ноябрь, 2008 09:27

к Madzi:
Попадался-ли Вам в руки такой документик http://nativesystems.inf.ethz.ch/pub/Ma ... lgebra.pdf
Это векторно-матрично-тензорные расширения к AO.
С использованием возможно производить операции даже между частями векторов и матриц.
Код:
var
  M,N: array [* ,*] of real ;
  v: array [*] of integer;
  w: array [*] of real ;
procedure P(var a: array [* ,*] of real );
procedure Q(const a: array[*] of real );
procedure R (): array [*] of integer;
begin
  new(M ,3 ,5); NEW (w ,10); (* creation *)
  M := [[1 ,2 ,3] ,[4 ,5 ,6]]; (* (re -) allocation if necessary *)
  w [1..3] := M [1 ,*]; (* assignment *)
  P(M [0..3 ,0..3]); Q(v [*]); v := R (); (* procedure calls *)
PS. Правда, это пока не очень оптимально по скорости...

==========================================================
bohdant
 Заголовок сообщения: Re: Общие вопросы по программированию для BluebottleСообщениеДобавлено: Среда, 05 Ноябрь, 2008 09:33
Аватара пользователя

Зарегистрирован: Суббота, 15 Март, 2008 20:00
Сообщения: 297
Откуда: Київ, Україна 
Madzi писал(а):
Я так полагаю, что ради скорости портирования. Т.е. часть кода Аос не оригинальная, а портирована с того же Си (драйвера, например)

Я тоже так думаю, однако иногда действительно полезно:
Код:
            ASSERT ( tail + n <= LEN( buf ) );   (* index check *)
            SYSTEM.MOVE( SYSTEM.ADR( x[ofs] ), SYSTEM.ADR( buf[tail] ), n );  INC( tail, n );  

Кстати статистика: в каждом шестом модуле применяется  :mrgreen:
 
Править - История - Печать - Последние изменения - Поиск
Редакция от 02.01.2020 16:13